home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
3D Game Programming All in One
/
3D Game Programming All in One Disc.iso
/
3D2E
/
demo
/
server
/
scripts
/
scene.cs
< prev
next >
Wrap
Text File
|
2006-09-21
|
14KB
|
542 lines
//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Functions that implement game-play
//-----------------------------------------------------------------------------
package DemoSceneGame {
//-----------------------------------------------------------------------------
function GameConnection::onClientEnterGame(%this)
{
commandToClient(%this,'SyncClock', $Sim::Time - $Game::StartTime);
commandToClient(%this,'SetGameGUI',"SceneGui");
// Create a new camera object.
%this.camera = new Camera() {
dataBlock = Observer;
};
MissionCleanup.add( %this.camera );
%this.camera.scopeToClient(%this);
// Create path camera
%this.player = new PathCamera() {
dataBlock = LoopingCam;
position = Scene::getStartPos();
};
MissionCleanup.add( %this.player );
%this.player.scopeToClient(%this);
// Start up the room gui system
$Server::Client = %this;
%this.setControlObject(%this.player);
SceneGui.setSceneNumber(0);
// Force detail settings
$Pref::TS::detailAdjust = 1;
$Pref::TS::screenError = 10;
// Start NPC orcs
newNPCOrc("MissionGroup/Paths/OrcNPC1",0.75);
newNPCOrc("MissionGroup/Paths/OrcNPC2",0.75);
newNPCOrc("MissionGroup/Paths/OrcNPC3",0.40);
}
//-----------------------------------------------------------------------------
function GameConnection::createPlayer(%this, %spawnPoint)
{
}
//-----------------------------------------------------------------------------
function serverCmdSuicide(%client)
{
if (isObject(%client.player)) {
%client.player.delete();
%client.player = 0;
}
%client.spawnPlayer();
}
};
//-----------------------------------------------------------------------------
// Scene Class
//-----------------------------------------------------------------------------
$Server::CurrentScene = 0;
// Scene activation is driven from the DemoGui and related scripts.
// (see demo/client/scripts/demoGui.cs)
function Scene::activateScene(%number)
{
if (isObject($Server::CurrentScene))
$Server::CurrentScene.close();
$Server::CurrentScene = "MissionGroup/Scenes".getObject(%number);
echo("Activating Scene #"@%number);
$Server::CurrentScene.open();
return $Server::CurrentScene;
}
function Scene::open(%this)
{
echo("Scene " @ %this.getName() @ " open");
%client = $Server::Client;
// Push any scene specific controls
if (isObject(%this.gui))
Canvas.pushDialog(%this.gui);
// Set the path to follow, the camera will start at
// the first node in the path.
%path = %this.getId() @ "/path";
if (isObject(%path)) {
%client.player.reset(0);
%client.player.followPath(%path);
}
else {
// Check for a static camera
%start = %this.getId() @ "/start";
if (isObject(%start)) {
echo("Static Camera");
%client.player.reset(0);
%client.player.pushNode(%start);
%client.player.popFront();
}
}
}
function Scene::getStartPos()
{
%scene = "MissionGroup/Scenes".getObject(0);
%start = %scene.getId() @ "/start";
if (isObject(%start))
return %start.getTransform();
return "0 0 100";
}
function Scene::close(%this)
{
%client = $Server::Client;
// Pop any scene specific controls
if (isObject(%this.gui))
Canvas.popDialog(%this.gui);
echo("Scene " @ %this.getName() @ " closed");
}
//-----------------------------------------------------------------------------
// Orc Animation
//-----------------------------------------------------------------------------
function newNPCOrc(%path,%speed)
{
%orc = AIPlayer::spawnOnPath("NPC",%path);
%orc.setMoveSpeed(%speed);
%orc.mountImage(CrossbowImage,0);
%orc.pushTask("followPath(\""@%path@"\",-1)");
}
function newAnimationOrc()
{
if (isObject($AnimationOrc))
$AnimationOrc.clearTasks();
else {
$AnimationOrc = AIPlayer::spawnOnPath("Tarkof","MissionGroup/Paths/OrcAnimation");
$AnimationOrc.setMoveSpeed(0.75);
$AnimationOrc.mountImage(CrossbowImage,0);
$AnimationOrc.setInventory(CrossbowAmmo,1000);
}
$AnimationOrc.pushTask("followPath(\"MissionGroup/Paths/OrcAnimation\",100)");
}
function deleteAnimationOrc()
{
if (isObject($AnimationOrc)) {
$AnimationOrc.clearTasks();
$AnimationOrc.pushTask("followPath(\"MissionGroup/Paths/OrcAnimation\",0)");
$AnimationOrc.pushTask("done()");
}
}
function AnimationOrcPlay(%anim)
{
$AnimationOrc.clearTasks();
$AnimationOrc.pushTask("animate(\""@%anim@"\")");
}
function newDancingOrc()
{
if (isObject($DancingOrc))
$DancingOrc.clearTasks();
else {
$DancingOrc = AIPlayer::spawnOnPath("Dance","MissionGroup/Paths/OrcDance");
$DancingOrc.setMoveSpeed(0.75);
}
$DancingOrc.pushTask("followPath(\"MissionGroup/Paths/OrcDance\",100)");
$DancingOrc.pushTask("animate(\"dance\")");
}
function deleteDancingOrc()
{
if (isObject($DancingOrc)) {
$DancingOrc.clearTasks();
$DancingOrc.pushTask("followPath(\"MissionGroup/Paths/OrcDance\",0)");
$DancingOrc.pushTask("done()");
}
}
function newDetailOrc()
{
if (isObject($DetailOrc)) {
$DetailOrc.clearTasks();
$DetailOrc.unmountImage(0);
$DetailOrc.unmountImage(1);
$DetailOrc.setArmThread("looknw");
}
else {
$DetailOrc = AIPlayer::spawnOnPath("Detail","MissionGroup/Paths/OrcDetail");
$DetailOrc.setMoveSpeed(0.75);
$DetailOrc.setArmThread("looknw");
}
$DetailOrc.pushTask("followPath(\"MissionGroup/Paths/OrcDetail\",100)");
}
function deleteDetailOrc()
{
if (isObject($DetailOrc)) {
$DetailOrc.clearTasks();
$DetailOrc.pushTask("followPath(\"MissionGroup/Paths/OrcDetail\",0)");
$DetailOrc.pushTask("done()");
}
}
function mountDetailOrc(%object,%slot)
{
if ($DetailOrc.getMountedImage(%slot) == %object.getId()) {
$DetailOrc.unmountImage(%slot);
if (%slot == 0)
$DetailOrc.setArmThread("looknw");
}
else {
$DetailOrc.mountImage(%object,%slot);
if (%slot == 0)
$DetailOrc.setArmThread("look");
}
}
function newShootingOrc()
{
if (isObject($ShootingOrc))
$ShootingOrc.clearTasks();
else {
$ShootingOrc = AIPlayer::spawnOnPath("Detail","MissionGroup/Paths/OrcShooting");
$ShootingOrc.mountImage(CrossbowImage,0);
$ShootingOrc.setInventory(CrossbowAmmo,500000);
$ShootingOrc.setMoveSpeed(0.75);
}
$ShootingOrc.pushTask("followPath(\"MissionGroup/Paths/OrcShooting\",100)");
$ShootingOrc.pushTask("aimAt(\"MissionGroup/Scenes/ProjectileScene/target\")");
$ShootingOrc.pushTask("wait(1)");
$ShootingOrc.pushTask("fire(true)");
}
function deleteShootingOrc()
{
if (isObject($ShootingOrc)) {
$ShootingOrc.clearTasks();
$ShootingOrc.pushTask("fire(false)");
$ShootingOrc.pushTask("followPath(\"MissionGroup/Paths/OrcShooting\",0)");
$ShootingOrc.pushTask("done()");
}
}
//-----------------------------------------------------------------------------
// Environment effects
//-----------------------------------------------------------------------------
function startRain()
{
if (!isObject($Rain))
$Rain = new Precipitation() {
datablock = "HeavyRain";
minSpeed = 10;
maxSpeed = 15;
numDrops = 800;
boxWidth = 80;
boxHeight = 50;
minMass = 0.05;
maxMass = 5;
rotateWithCamVel = true;
doCollision = true;
useTurbulence = true;
maxTurbulence = 0.1;
turbulenceSpeed = 0.2;
};
if (!isObject($Rain2))
$Rain2 = new Precipitation() {
datablock = "HeavyRain2";
minSpeed = 0.3;
maxSpeed = 0.6;
numDrops = 100;
boxWidth = 100;
boxHeight = 100;
minMass = 0.01;
maxMass = 1;
maxTurbulence = 0.05;
turbulenceSpeed = 0.15;
rotateWithCamVel = true;
doCollision = false;
useTurbulence = true;
};
}
function stopRain()
{
if (isObject($Rain))
$Rain.delete();
$Rain = "";
if (isObject($Rain2))
$Rain2.delete();
$Rain2 = "";
}
function startLightning()
{
if (!isObject($Lightning))
$Lightning = new Lightning() {
position = "350 300 180";
scale = "250 400 500";
dataBlock = "LightningStorm";
strikesPerMinute = "50";
strikeWidth = "2.5";
chanceToHitTarget = "100";
strikeRadius = "50";
boltStartRadius = "20";
color = "1.000000 1.000000 1.000000 1.000000";
fadeColor = "0.400000 0.400000 0.100000 1.000000";
useFog = "1";
locked = "false";
};
}
function stopLightning()
{
if (isObject($Lightning))
$Lightning.delete();
$Lightning = "";
}
//-----------------------------------------------------------------------------
// Scenes
//-----------------------------------------------------------------------------
function InteriorSpaces::open(%this)
{
Parent::open(%this);
newAnimationOrc();
}
function InteriorSpaces::close(%this)
{
Parent::close(%this);
deleteAnimationOrc();
}
function OrcAnimationScene::open(%this)
{
Parent::open(%this);
newAnimationOrc();
deleteDancingOrc();
$AnimationOrc.pushTask("wait(0.5)");
$AnimationOrc.pushTask("animate(\"celwave\")");
}
function OrcDanceScene::open(%this)
{
Parent::open(%this);
deleteAnimationOrc();
newDancingOrc();
}
function OrcShadowScene::open(%this)
{
Parent::open(%this);
newDancingOrc();
deleteDetailOrc();
}
function OrcDetailScene::open(%this)
{
Parent::open(%this);
deleteDancingOrc();
newDetailOrc();
%this.detailSetting = $Pref::TS::detailAdjust;
%this.screenError = $pref::TS::screenError;
DetailSceneSlider.setValue($Pref::TS::detailAdjust);
}
function OrcDetailScene::close(%this)
{
$Pref::TS::detailAdjust = %this.detailSetting;
$Pref::TS::detailAdjust = %this.screenError;
DetailSceneSlider.setValue(%this.detailSetting);
Parent::close(%this);
}
function OrcDetailScene::slider(%this)
{
$Pref::TS::detailAdjust = DetailSceneSlider.getValue();
$Pref::TS::screenError = 1 + 35 * (1 - $Pref::TS::detailAdjust);
}
function OrcMountingScene::open(%this)
{
Parent::open(%this);
newDetailOrc();
deleteShootingOrc();
}
function ProjectileScene::open(%this)
{
Parent::open(%this);
deleteDetailOrc();
newShootingOrc();
}
function ExplosionScene::open(%this)
{
Parent::open(%this);
newShootingOrc();
}
function FXLightScene::open(%this)
{
Parent::open(%this);
deleteShootingOrc();
}
function MirrorScene::open(%this)
{
Parent::open(%this);
stopRain();
}
function PrecipitationScene::open(%this)
{
Parent::open(%this);
startRain();
stopLightning();
}
function LightningScene::open(%this)
{
Parent::open(%this);
startRain();
startLightning();
Sky.stormFog(0,3);
}
function FogScene::open(%this)
{
Parent::open(%this);
Sky.stormFog(1,3);
startRain();
stopLightning();
}
function InFogScene::open(%this)
{
Parent::open(%this);
Sky.stormFog(1,3);
startRain();
}
function WaterScene::open(%this)
{
Parent::open(%this);
Sky.stormFog(0,3);
stopRain();
}
function TorqueScene::open(%this)
{
Parent::open(%this);
TorqueLogoScreen.visible = 0;
}
//-----------------------------------------------------------------------------
// Path Camera
//-----------------------------------------------------------------------------
datablock PathCameraData(LoopingCam)
{
mode = "";
};
function LoopingCam::onNode(%this,%camera,%node)
{
if (%node == %camera.loopNode) {
%camera.pushPath(%camera.path);
%camera.loopNode += %camera.path.getCount();
}
}
function PathCamera::followPath(%this,%path)
{
%this.path = %path;
if (!(%this.speed = %path.speed))
%this.speed = 100;
if (%path.isLooping)
%this.loopNode = %path.getCount() - 2;
else
%this.loopNode = -1;
%this.pushPath(%path);
%this.popFront();
}
function PathCamera::pushPath(%this,%path)
{
for (%i = 0; %i < %path.getCount(); %i++)
%this.pushNode(%path.getObject(%i));
}
function PathCamera::pushNode(%this,%node)
{
if (!(%speed = %node.speed))
%speed = %this.speed;
if ((%type = %node.type) $= "")
%type = "Normal";
if ((%smoothing = %node.smoothing) $= "")
%smoothing = "Linear";
%this.pushBack(%node.getTransform(),%speed,%type,%smoothing);
}
//-----------------------------------------------------------------------------
datablock ItemData(Logo)
{
// An item is used
category = "Misc";
shapeFile = "~/data/shapes/logo/torque_logo.dts";
};